package mx.com.asteca.servicio.impl;

import java.util.List;

import mx.com.asteca.comun.Constantes;
import mx.com.asteca.comun.dto.DocumentoDTO;
import mx.com.asteca.comun.dto.PersonaDTO;
import mx.com.asteca.persistencia.PersistenciaException;
import mx.com.asteca.persistencia.dao.BaseDAO;
import mx.com.asteca.persistencia.dao.PersonaDAO;
import mx.com.asteca.persistencia.entidades.Docs;
import mx.com.asteca.persistencia.entidades.Personas;
import mx.com.asteca.servicio.PersonaServicio;
import mx.com.asteca.servicio.ServicioException;
import mx.com.asteca.servicio.assembler.Assembler;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class PersonaServicioImpl extends
		BaseServiceImpl<PersonaDTO, Integer, Personas> implements PersonaServicio{

	@Autowired
	private PersonaDAO daoPersona;
	@Autowired
	@Qualifier(Constantes.ASSEMBLER_PERSONA)
	private Assembler assembler;
	@Autowired
	@Qualifier(Constantes.ASSEMBLER_DOCS)
	private Assembler assemblerDocs;
	
	@Override
	BaseDAO getDAO() {
		return daoPersona;
	}

	@Override
	Assembler getAssembler() {
		return assembler;
	}
	
	@Override
	@Transactional(readOnly=true)
	public List<PersonaDTO> findBloqueados() throws ServicioException{
		try{
			List<Personas> lista = daoPersona.findBloqueados();
			List<PersonaDTO> listaDTO = assembler.getDTOListTransform(lista);
			return listaDTO;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en findBloqueados:"+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional
	public void desbloqueadUsuario(int idPersona) throws ServicioException{
		try{
			daoPersona.desbloqueaUsuario(idPersona);
			daoPersona.reseteaContador(idPersona);
		}catch(PersistenciaException e){
			throw new ServicioException("Error en desbloqueadUsuario:"+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional
	public void reseteaContador(int idPersona) throws ServicioException{
		try{
			daoPersona.reseteaContador(idPersona);
		}catch(PersistenciaException e){
			throw new ServicioException("Error en reseteaContador:"+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional
	public void bloqueaUsuario(int idPersona) throws ServicioException{
		try{
			daoPersona.bloqueaUsuario(idPersona);
		}catch(PersistenciaException e){
			throw new ServicioException("Error en aumentaContador:"+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional
	public int aumentaContador(int idPersona) throws ServicioException{
		try{
			int contador = daoPersona.aumentaContador(idPersona);
			return contador;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en aumentaContador:"+e.getMessage(), e);
		}
	}

	@Override
	@Transactional(readOnly = true)
	public List<DocumentoDTO> getDocumentosByAlumno(int idPersona) throws ServicioException{
		try{
			List<Docs> listaDocs = daoPersona.getDocumentosByAlumno(idPersona);
			List<DocumentoDTO> listaDocumentos = assemblerDocs.getDTOListTransform(listaDocs);
			return listaDocumentos;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en getDocumentosByAlumno:"+e.getMessage(), e);
		}
	}

	@Override
	@Transactional(readOnly = true)
	public List<DocumentoDTO> getDocumentosByInstructor(int idPersona) throws ServicioException{
		try{
			List<Docs> listaDocs = daoPersona.getDocumentosByInstructor(idPersona);
			List<DocumentoDTO> listaDocumentos = assemblerDocs.getDTOListTransform(listaDocs);
			return listaDocumentos;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en getDocumentosByAlumno:"+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional(readOnly = true)
	public PersonaDTO findByUserName(String userName) throws ServicioException {
		try {
			Personas usuario = daoPersona.findByUserName(userName);
			PersonaDTO usuarioDTO = (PersonaDTO) assembler
					.getDTOTransform(usuario);
			
			return usuarioDTO;
		} catch (Exception e) {
			e.printStackTrace();
			throw new ServicioException(e.getMessage(),e);
		}
	}
	
	@Override
	@Transactional(readOnly=true)
	public List<PersonaDTO> findActiveUsers() throws ServicioException{
		try{
			List<Personas> listMapping = daoPersona.findActiveUsers();
			List<PersonaDTO> listDTO = assembler.getDTOListTransform(listMapping);
			return listDTO;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en findActiveUsers: "+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional(readOnly=true)
	public boolean isAlumno(int idPersona) throws ServicioException{
		try{
			boolean isAlumno = daoPersona.isAlumno(idPersona);
			return isAlumno;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en isAlumno: "+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional(readOnly=true)
	public int getIdAlumno(int idPersona) throws ServicioException{
		try{
			int idAlumno = daoPersona.getIdAlumno(idPersona);
			return idAlumno;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en getIdAlumno: "+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional(readOnly=true)
	public boolean isAdmin(int idPersona) throws ServicioException{
		try{
			boolean isAdministrativo = daoPersona.isAdministrativo(idPersona);
			return isAdministrativo;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en isAdmin: "+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional(readOnly=true)
	public boolean isInstructor(int idPersona) throws ServicioException{
		try{
			boolean isInstructor = daoPersona.isInstructor(idPersona);
			return isInstructor;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en isInstructor: "+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional(readOnly=true)
	public int getIdInstructor(int idPersona) throws ServicioException{
		try{
			int idAlumno = daoPersona.getIdInstructor(idPersona);
			return idAlumno;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en getIdAlumno: "+e.getMessage(), e);
		}
	}

	@Override
	@Transactional(readOnly=true)
	public boolean isReferencia(int idPersona) throws ServicioException{
		try{
			boolean isInstructor = daoPersona.isReferencia(idPersona);
			return isInstructor;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en isReferencia: "+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional(readOnly=true)
	public boolean isContacto(int idPersona) throws ServicioException{
		try{
			boolean isInstructor = daoPersona.isContacto(idPersona);
			return isInstructor;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en isContacto: "+e.getMessage(), e);
		}
	}
}
